import os
# 给予一个源目录："D:\pythonProject"
# 需求：把该目录（目录下面可能还有子目录）下所有的py文件拷贝到另一个指定目录中
def copy_dir(source_dir,destination_dir):
    """
    拷贝source_dir目录中的py文件到destination目录中
    :param source_dir:原始目录
    :param destination_dir:目标目录
    :return:返回一共拷贝py文件的数量
    """
    count = 0
    # 其中的f表示目录下每个文件（目录）的名字
    for f in os.listdir(source_dir):
        # 把文件名和目录拼凑成一个完整的绝对路径
        f_path = os.path.join(source_dir,f)
        if os.path.isfile(f_path) and f.endswith(".py"):    # 表示f是一个普通文件并且也是py文件
            # 要拷贝该文件
            if not os.path.exists(destination_dir):     # 目标文件不存在
                os.makedirs(destination_dir)       # 创建新目录（多个，.mkdir只能创建一个目录）
            # 拼凑一个拷贝之后的目标文件绝对路径
            sink_path = os.path.join(destination_dir,f)
            # 拷贝文件内容到sink_path中
            num = copy_file(f_path,sink_path)
            count += num
        elif os.path.isdir(f_path):      # 表示f是一个目录
            # 采用递归函数的写法
            # 为了保持相同的目录结构，目标目录也要跟着变化
            new_destination_path = os.path.join(destination_dir,f)
            copy_dir(f_path,new_destination_path)
    return count
def copy_file(source_file,sink_file):
    """
    拷贝单个文件，把source_file文件内容，拷贝到sink_file中
    :param source_file:原始文件的绝对路径
    :param sink_file:目标文件的绝对路径
    :return:拷贝成功后返回1
    """
# 第一种：考虑到文件都是小文件：可以一次性读取全部文件内容，并一次性写入新文件
    # with open(source_file,mode = "r",encoding = "UTF—8") as source_f:
        # content = source_f.read()
        # with open(sink_file,mode = "w",encoding = "UTF—8") as sink_f:
            # sink_f.write(content)
    # return 1
# copy_dir(r"D:\pythonProject",r"E:\text_dir")

# 第二种：考虑到文件都比较大，每次从源文件中读取一部分内容，并写入到新的文件（循环多次）
    source_f = open(source_file,mode = "r",encoding = "UTF—8")
    sink_f = open(sink_file,mode = "w",encoding = "UTF—8")
    while True:
        content = source_f.read(1024*10)    # 每次读取10KB
        if content == ''or content is None:       # 没有读取到数据
            break   # 意味着文件读完
        sink_f.write(content)
    source_f.close()
    sink_f.close()
    return 1
copy_dir(r"/", r"E:\text_dir")